home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / SURFACE4.FRM < prev    next >
Text File  |  1996-05-02  |  16KB  |  610 lines

  1. VERSION 4.00
  2. Begin VB.Form SurfaceForm 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Surfaces"
  6.    ClientHeight    =   5700
  7.    ClientLeft      =   300
  8.    ClientTop       =   855
  9.    ClientWidth     =   9090
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   1
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   6390
  21.    KeyPreview      =   -1  'True
  22.    Left            =   240
  23.    LinkTopic       =   "Form1"
  24.    ScaleHeight     =   5700
  25.    ScaleWidth      =   9090
  26.    Top             =   225
  27.    Width           =   9210
  28.    Begin VB.CheckBox ShowAxesCheck 
  29.       Caption         =   "Show Axes"
  30.       Height          =   255
  31.       Left            =   7080
  32.       TabIndex        =   17
  33.       Top             =   3960
  34.       Width           =   2055
  35.    End
  36.    Begin VB.CheckBox ShowDataCheck 
  37.       Caption         =   "Show True Data"
  38.       Height          =   255
  39.       Left            =   7080
  40.       TabIndex        =   16
  41.       Top             =   3480
  42.       Width           =   2055
  43.    End
  44.    Begin VB.OptionButton Choice 
  45.       Caption         =   "Saddle"
  46.       Height          =   255
  47.       Index           =   8
  48.       Left            =   7080
  49.       TabIndex        =   15
  50.       Top             =   2880
  51.       Width           =   2055
  52.    End
  53.    Begin VB.OptionButton Choice 
  54.       Caption         =   "Cone"
  55.       Height          =   255
  56.       Index           =   7
  57.       Left            =   7080
  58.       TabIndex        =   14
  59.       Top             =   2520
  60.       Width           =   2055
  61.    End
  62.    Begin VB.OptionButton Choice 
  63.       Caption         =   "Holes"
  64.       Height          =   255
  65.       Index           =   6
  66.       Left            =   7080
  67.       TabIndex        =   13
  68.       Top             =   2160
  69.       Width           =   2055
  70.    End
  71.    Begin VB.TextBox PhiText 
  72.       Height          =   285
  73.       Left            =   3600
  74.       TabIndex        =   12
  75.       Text            =   "0.1570"
  76.       Top             =   5400
  77.       Width           =   855
  78.    End
  79.    Begin VB.TextBox ThetaText 
  80.       Height          =   285
  81.       Left            =   2040
  82.       TabIndex        =   10
  83.       Text            =   "0.6283"
  84.       Top             =   5400
  85.       Width           =   855
  86.    End
  87.    Begin VB.TextBox RText 
  88.       Height          =   285
  89.       Left            =   480
  90.       TabIndex        =   8
  91.       Text            =   "10"
  92.       Top             =   5400
  93.       Width           =   855
  94.    End
  95.    Begin VB.OptionButton Choice 
  96.       Caption         =   "Hemisphere"
  97.       Height          =   255
  98.       Index           =   5
  99.       Left            =   7080
  100.       TabIndex        =   7
  101.       Top             =   1800
  102.       Width           =   2055
  103.    End
  104.    Begin VB.OptionButton Choice 
  105.       Caption         =   "Randomized Ridges"
  106.       Height          =   255
  107.       Index           =   4
  108.       Left            =   7080
  109.       TabIndex        =   6
  110.       Top             =   1440
  111.       Width           =   2055
  112.    End
  113.    Begin VB.OptionButton Choice 
  114.       Caption         =   "Ridges"
  115.       Height          =   255
  116.       Index           =   3
  117.       Left            =   7080
  118.       TabIndex        =   5
  119.       Top             =   1080
  120.       Width           =   2055
  121.    End
  122.    Begin VB.OptionButton Choice 
  123.       Caption         =   "Bowl"
  124.       Height          =   255
  125.       Index           =   2
  126.       Left            =   7080
  127.       TabIndex        =   4
  128.       Top             =   720
  129.       Width           =   2055
  130.    End
  131.    Begin VB.OptionButton Choice 
  132.       Caption         =   "Mounds"
  133.       Height          =   255
  134.       Index           =   1
  135.       Left            =   7080
  136.       TabIndex        =   3
  137.       Top             =   360
  138.       Width           =   2055
  139.    End
  140.    Begin VB.OptionButton Choice 
  141.       Caption         =   "Splash"
  142.       Height          =   255
  143.       Index           =   0
  144.       Left            =   7080
  145.       TabIndex        =   2
  146.       Top             =   0
  147.       Value           =   -1  'True
  148.       Width           =   2055
  149.    End
  150.    Begin VB.PictureBox Pict 
  151.       AutoRedraw      =   -1  'True
  152.       Height          =   5295
  153.       Left            =   0
  154.       ScaleHeight     =   349
  155.       ScaleMode       =   3  'Pixel
  156.       ScaleWidth      =   461
  157.       TabIndex        =   0
  158.       Top             =   0
  159.       Width           =   6975
  160.    End
  161.    Begin MSComDlg.CommonDialog LoadDialog 
  162.       Left            =   7080
  163.       Top             =   4560
  164.       _version        =   65536
  165.       _extentx        =   847
  166.       _extenty        =   847
  167.       _stockprops     =   0
  168.       cancelerror     =   -1  'True
  169.    End
  170.    Begin VB.Label Label1 
  171.       Caption         =   "Phi"
  172.       Height          =   255
  173.       Index           =   2
  174.       Left            =   3240
  175.       TabIndex        =   11
  176.       Top             =   5400
  177.       Width           =   375
  178.    End
  179.    Begin VB.Label Label1 
  180.       Caption         =   "Theta"
  181.       Height          =   255
  182.       Index           =   1
  183.       Left            =   1440
  184.       TabIndex        =   9
  185.       Top             =   5400
  186.       Width           =   495
  187.    End
  188.    Begin VB.Label Label1 
  189.       Caption         =   "R"
  190.       Height          =   255
  191.       Index           =   0
  192.       Left            =   240
  193.       TabIndex        =   1
  194.       Top             =   5400
  195.       Width           =   255
  196.    End
  197.    Begin VB.Menu mnuFile 
  198.       Caption         =   "&File"
  199.       Begin VB.Menu mnuFileLoad 
  200.          Caption         =   "&Load..."
  201.          Shortcut        =   ^L
  202.       End
  203.       Begin VB.Menu mnuFileSaveAs 
  204.          Caption         =   "&Save As..."
  205.          Shortcut        =   ^A
  206.       End
  207.       Begin VB.Menu mnuFileSep 
  208.          Caption         =   "-"
  209.       End
  210.       Begin VB.Menu mnuFileExit 
  211.          Caption         =   "E&xit"
  212.       End
  213.    End
  214. End
  215. Attribute VB_Name = "SurfaceForm"
  216. Attribute VB_Creatable = False
  217. Attribute VB_Exposed = False
  218. Option Explicit
  219.  
  220. ' Location of viewing eye.
  221. Dim EyeR As Single
  222. Dim EyeTheta As Single
  223. Dim EyePhi As Single
  224.  
  225. Const Dtheta = PI / 20
  226. Const Dphi = PI / 20
  227. Const Dr = 1
  228.  
  229. ' Location of focus point.
  230. Const FocusX = 0#
  231. Const FocusY = 0#
  232. Const FocusZ = 0#
  233.  
  234. Dim Projector(1 To 4, 1 To 4) As Single
  235.  
  236. Dim ThePicture As ObjPicture
  237.  
  238. Dim ShowingParameters As Boolean
  239.  
  240. Dim ChoiceNum As Integer
  241.  
  242. Dim Sparse As ObjSparseGrid
  243. ' *******************************************************
  244. ' Rotate the points in the cube and draw the cube.
  245. ' *******************************************************
  246. Private Sub DrawData(pic As Object)
  247. Dim x As Single
  248. Dim y As Single
  249. Dim z As Single
  250. Dim S(1 To 4, 1 To 4) As Single
  251. Dim t(1 To 4, 1 To 4) As Single
  252. Dim ST(1 To 4, 1 To 4) As Single
  253. Dim PST(1 To 4, 1 To 4) As Single
  254.  
  255.     MousePointer = vbHourglass
  256.     Refresh
  257.     
  258.     ' Prevent overflow errors when drawing lines
  259.     ' too far out of bounds.
  260.     On Error Resume Next
  261.     
  262.     ' Scale and translate so it looks OK in pixels.
  263.     m3Scale S, 35, -35, 1
  264.     m3Translate t, 230, 175, 0
  265.     m3MatMultiplyFull ST, S, t
  266.     m3MatMultiplyFull PST, Projector, ST
  267.     
  268.     ' Transform the points.
  269.     ThePicture.ApplyFull PST
  270.  
  271.     ' Display the data.
  272.     pic.Cls
  273.     ThePicture.Draw pic, EyeR
  274.     pic.Refresh
  275.  
  276.     ' Display the viewnig parameters.
  277.     ShowViewingParameters
  278.  
  279.     MousePointer = vbDefault
  280. End Sub
  281.  
  282. Sub ShowViewingParameters()
  283.     ShowingParameters = True
  284.     
  285.     RText.Text = Format$(EyeR, "0.0000")
  286.     ThetaText.Text = Format$(EyeTheta, "0.0000")
  287.     PhiText.Text = Format$(EyePhi, "0.0000")
  288.     
  289.     RText.Refresh
  290.     ThetaText.Refresh
  291.     PhiText.Refresh
  292.  
  293.     ShowingParameters = False
  294. End Sub
  295.  
  296. Private Sub Choice_Click(Index As Integer)
  297.     ChoiceNum = Index
  298.     CreateData (ShowAxesCheck.value = vbChecked)
  299.     DrawData Pict
  300.     Pict.SetFocus
  301. End Sub
  302.  
  303. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  304.     Select Case KeyCode
  305.         Case vbKeyLeft
  306.             EyeTheta = EyeTheta - Dtheta
  307.         
  308.         Case vbKeyRight
  309.             EyeTheta = EyeTheta + Dtheta
  310.         
  311.         Case vbKeyUp
  312.             EyePhi = EyePhi - Dphi
  313.         
  314.         Case vbKeyDown
  315.             EyePhi = EyePhi + Dphi
  316.                 
  317.         Case Else
  318.             Exit Sub
  319.     End Select
  320.  
  321.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  322.     DrawData Pict
  323. End Sub
  324.  
  325.  
  326. Private Sub Form_KeyPress(KeyAscii As Integer)
  327.     Select Case KeyAscii
  328.         Case Asc("+")
  329.             EyeR = EyeR + Dr
  330.         
  331.         Case Asc("-")
  332.             EyeR = EyeR - Dr
  333.         
  334.         Case Else
  335.             Exit Sub
  336.     End Select
  337.  
  338.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  339.     DrawData Pict
  340. End Sub
  341.  
  342. Private Sub Form_Load()
  343.     ' Initialize the eye position.
  344.     EyeR = 10
  345.     EyeTheta = PI * 0.2
  346.     EyePhi = PI * 0.1
  347.     
  348.     ' Initialize the projection transformation.
  349.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  350.     
  351.     ' Create the data.
  352.     CreateData (ShowAxesCheck.value = vbChecked)
  353.  
  354.     ' Project and draw the data.
  355.     Me.Show
  356.     DrawData Pict
  357. End Sub
  358.  
  359.  
  360. ' ************************************************
  361. ' Create the surface.
  362. ' ************************************************
  363. Sub CreateData(show_axes As Boolean)
  364. Const Xmin = -5
  365. Const Zmin = -5
  366. Const Xmax = -Xmin
  367. Const Zmax = -Zmin
  368. Const Dx = 0.3
  369. Const Dz = 0.3
  370. Const NumX = -2 * Xmin / Dx
  371. Const NumZ = -2 * Zmin / Dz
  372. Const Amp = 0.25
  373. Const Per = 2 * PI / 4
  374. Const Amp2 = 1
  375. Const Per2 = 2 * PI / 16
  376. Const Amp3 = 2
  377. Const num_pts = NumX * NumZ / 4
  378.  
  379. Dim axis As ObjPolyline
  380. Dim i As Integer
  381. Dim x As Single
  382. Dim y As Single
  383. Dim z As Single
  384. Dim D As Single
  385. Dim R2 As Single
  386. Dim x1 As Single
  387. Dim z1 As Single
  388. Dim x2 As Single
  389. Dim z2 As Single
  390.  
  391.     MousePointer = vbHourglass
  392.     Refresh
  393.     
  394.     Set ThePicture = New ObjPicture
  395.     Set Sparse = New ObjSparseGrid
  396.     Sparse.ShowTrueData = (showdatacheck.value = vbChecked)
  397.     ThePicture.objects.Add Sparse
  398.  
  399.     If show_axes Then
  400.         Set axis = New ObjPolyline
  401.         ThePicture.objects.Add axis
  402.         axis.AddSegment 0, 0, 0, 5.5, 0, 0
  403.         axis.AddSegment 0, 0, 0, 0, 3, 0
  404.         axis.AddSegment 0, 0, 0, 0, 0, 5.5
  405.     End If
  406.     
  407.     R2 = (Xmin + 3 * Dx) * (Xmin + 3 * Dx)
  408.     For i = 1 To num_pts
  409.         x = (Xmax - Xmin) * Rnd + Xmin
  410.         z = (Zmax - Zmin) * Rnd + Zmin
  411.         Select Case ChoiceNum
  412.             Case 0  ' Splash.
  413.                 D = Sqr(x * x + z * z)
  414.                 y = Amp * Cos(3 * D)
  415.             
  416.             Case 1  ' Mounds.
  417.                 y = Amp * (Cos(Per * x) + Cos(Per * z))
  418.             
  419.             Case 2  ' Bowl.
  420.                 y = 0.2 * (x * x + z * z) - 5#
  421.             
  422.             Case 3  ' Ridges.
  423.                 y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1)
  424.         
  425.             Case 4  ' Random ridges.
  426.                 y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1) + Amp * Rnd
  427.         
  428.             Case 5  ' Hemisphere.
  429.                 D = x * x + z * z
  430.                 If D >= R2 Then
  431.                     y = 0
  432.                 Else
  433.                     y = Sqr(R2 - D)
  434.                 End If
  435.             
  436.             Case 6  ' Holes.
  437.                 x1 = (x + Xmin / 2)
  438.                 z1 = (z + Xmin / 2)
  439.                 x2 = (x - Xmin / 2)
  440.                 z2 = (z - Xmin / 2)
  441.                 y = Amp3 - _
  442.             1 / (x1 * x1 + z1 * z1 + 0.1) - _
  443.             1 / (x2 * x2 + z1 * z1 + 0.1) - _
  444.             1 / (x1 * x1 + z2 * z2 + 0.1) - _
  445.             1 / (x2 * x2 + z2 * z2 + 0.1)
  446.         
  447.             Case 7  ' Cone.
  448.                 y = 2 * (Amp3 - Sqr(x * x + z * z))
  449.                 If y < -Amp3 Then y = -Amp3
  450.         
  451.             Case 8  ' Saddle.
  452.                 y = (x * x - z * z) / 10
  453.             
  454.         End Select
  455.         
  456.         Sparse.SetValue x, y, z
  457.     Next i
  458.     
  459.     ' Create the grid data.
  460.     Sparse.InitializeGrid Dx, Dz
  461.     
  462.     MousePointer = vbDefault
  463. End Sub
  464.  
  465.  
  466. Private Sub mnuFileExit_Click()
  467.     Unload Me
  468. End Sub
  469. Private Sub mnuFileLoad_Click()
  470. Dim fname As String
  471. Dim filenum As Integer
  472. Dim txt As String
  473. Dim Xmin As Single
  474. Dim Ymin As Single
  475. Dim Xmax As Single
  476. Dim Ymax As Single
  477.  
  478.     ' Allow the user to pick a file.
  479.     On Error Resume Next
  480.     LoadDialog.filename = "*.APF"
  481.     LoadDialog.ShowOpen
  482.     If Err.Number = cdlCancel Then
  483.         Unload LoadDialog
  484.         Exit Sub
  485.     ElseIf Err.Number <> 0 Then
  486.         Unload LoadDialog
  487.         Beep
  488.         MsgBox "Error selecting file.", , vbExclamation
  489.         Exit Sub
  490.     End If
  491.     On Error GoTo 0
  492.     
  493.     MousePointer = vbHourglass
  494.     DoEvents
  495.     
  496.     fname = LoadDialog.filename
  497.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  498.         - Len(LoadDialog.FileTitle) - 1)
  499.  
  500.     ' Clear the picture.
  501.     Set ThePicture = Nothing
  502.     
  503.     ' Open the file.
  504.     filenum = FreeFile
  505.     Open fname For Input As #filenum
  506.     
  507.     ' Make sure it's an Object Picture File.
  508.     Input #filenum, txt
  509.     If txt <> "3D APF PICTURE" Then
  510.         Close filenum
  511.         Beep
  512.         MsgBox "Error reading file """ & fname & """.", , vbExclamation
  513.         Exit Sub
  514.     End If
  515.  
  516.     ' Read the picture.
  517.     Set ThePicture = New ObjPicture
  518.     ThePicture.FileInput filenum
  519.     
  520.     ' Close the file.
  521.     Close filenum
  522.  
  523.     ' Refresh the display.
  524.     DrawData Pict
  525.     
  526.     ' Deselect all the option buttons.
  527.     For ChoiceNum = 0 To 8
  528.         If Choice(ChoiceNum).value Then _
  529.             Choice(ChoiceNum).value = False
  530.     Next ChoiceNum
  531.  
  532.     MousePointer = vbDefault
  533. End Sub
  534.  
  535. Private Sub mnuFileSaveAs_Click()
  536. Dim fname As String
  537. Dim filenum As Integer
  538.  
  539.     ' Allow the user to pick a file.
  540.     On Error Resume Next
  541.     LoadDialog.filename = "*.APF"
  542.     LoadDialog.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  543.     LoadDialog.ShowSave
  544.     If Err.Number = cdlCancel Then
  545.         Unload LoadDialog
  546.         Exit Sub
  547.     ElseIf Err.Number <> 0 Then
  548.         Unload LoadDialog
  549.         Beep
  550.         MsgBox "Error selecting file.", , vbExclamation
  551.         Exit Sub
  552.     End If
  553.     On Error GoTo 0
  554.     
  555.     fname = LoadDialog.filename
  556.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  557.         - Len(LoadDialog.FileTitle) - 1)
  558.     
  559.     ' Open the file.
  560.     filenum = FreeFile
  561.     Open fname For Output As #filenum
  562.     
  563.     ' Write the picture.
  564.     ThePicture.FileWrite filenum
  565.     
  566.     ' Close the file.
  567.     Close filenum
  568. End Sub
  569.  
  570.  
  571.  
  572.  
  573. Private Sub PhiText_Change()
  574.     If ShowingParameters Then Exit Sub
  575.     EyePhi = CSng(PhiText.Text)
  576.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  577.     DrawData Pict
  578. End Sub
  579.  
  580. Private Sub RText_Change()
  581.     If ShowingParameters Then Exit Sub
  582.     EyeR = CSng(RText.Text)
  583.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  584.     DrawData Pict
  585. End Sub
  586.  
  587.  
  588. Private Sub ShowAxesCheck_Click()
  589.     CreateData (ShowAxesCheck.value = vbChecked)
  590.     DrawData Pict
  591.     Pict.SetFocus
  592. End Sub
  593.  
  594. ' ************************************************
  595. ' Turn the drawing of the actual data on/off.
  596. ' ************************************************
  597. Private Sub ShowDataCheck_click()
  598.     Sparse.ShowTrueData = (showdatacheck.value = vbChecked)
  599.     DrawData Pict
  600.     Pict.SetFocus
  601. End Sub
  602.  
  603. Private Sub ThetaText_Change()
  604.     If ShowingParameters Then Exit Sub
  605.     EyeTheta = CSng(ThetaText.Text)
  606.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  607.     DrawData Pict
  608. End Sub
  609.  
  610.